// #include <stdio.h>
// #include "barrier.h"
// #include "newton.h"
// #include "interior_point.h"
// #include "NLP.h"

// NLPProblem create_problem() {
//     NLPProblem problem;
//     problem.n = 2; // 2个变量
//     problem.m = 1; // 1个不等式约束
//     problem.p = 0; // 无等式约束
    
//     // 赋值函数指针
//     problem.f = objective;
//     problem.grad_f = gradient;
//     problem.g = inequality_constraints;
//     problem.h = NULL; // 无等式约束
//     problem.jac_g = jacobian_ineq;
//     problem.jac_h = NULL; // 无等式约束雅可比
    
//     return problem;
// }


// int main() {
//     // 创建问题实例
//     NLPProblem problem = create_problem();
    
//     // 测试点
//     double x[2] = {0.5, 0.5};
    
//     // 计算目标函数值
//     double obj_val = problem.f(x);
//     printf("目标函数值: %f\n", obj_val);
    
//     // 计算梯度
//     double grad[2];
//     problem.grad_f(x, grad);
//     printf("梯度: [%f, %f]\n", grad[0], grad[1]);
    
//     // 计算不等式约束
//     double g_result[1];
//     problem.g(x, g_result);
//     printf("不等式约束值: %f\n", g_result[0]);
    
//     // 计算不等式约束雅可比
//     double *jac[1];
//     jac[0] = (double *)malloc(2 * sizeof(double));
//     problem.jac_g(x, jac);
//     printf("不等式约束雅可比: [%f, %f]\n", jac[0][0], jac[0][1]);
//     free(jac[0]);
    
//     return 0;
// }

#include <stdio.h>
#include "barrier.h"
#include "newton.h"
#include "interior_point.h"
#include "NLP.h"

// 7. 定义完整的NLP问题
NLPProblem problem = {
    .n = 2,          // 变量维度（x₀, x₁）
    .m = 3,          // 3个不等式约束
    .p = 2,          // 2个等式约束
    .f = objective,  // 目标函数指针
    .grad_f = gradient,
    .g = inequality_constraints,
    .h = equality_constraints,
    .jac_g = jacobian_ineq,
    .jac_h = jacobian_eq
};


int main() {
    // 1. 初始点选择（必须严格满足不等式约束 x0 > 0）
    double x0[2] = {0.5, 0.2};  // 满足 0.5 + 0.2 < 1, 且x0>0, x1>0
    
    // 2. 障碍参数初始值（典型值：1.0~100.0）
    double mu0 = 1.0;  
    
    // 3. 收敛容差（根据精度需求调整）
    double tol = 1e-6; 
    
    // 4. 最大迭代次数
    int max_iter = 50;
    
    // 调用内点法
    interior_point_method(&problem, x0, mu0, tol, max_iter);
    
    return 0;
}
